const os = require('os');

/**
 * 获取本机最可能的局域网 IPv4 地址（自动筛选）
 * 优先级：192.168.x.x > 10.x.x.x > 172.16.x.x ~ 172.31.x.x
 * 只返回 IPv4、非内部（非回环）、非虚拟的地址，通常是当前连接 Wi-Fi / 有线 LAN 的 IP
 * 
 * @returns {string|null} 返回一个局域网 IP，如 "192.168.1.119"；如果没有找到，返回 null
 */
function getLocalLANIP() {
  const interfaces = os.networkInterfaces();

  // 按优先级排序的 IP 类型
  const PRIORITY_ORDER = [
    /^192\.168\./, // 192.168.x.x -> 家用路由最常见
    /^10\./,       // 10.x.x.x       -> 企业内网常见
    /^172\.(1[6-9]|2[0-9]|3[0-1])\./  // 172.16.0.0 ~ 172.31.0.0
  ];

  const candidates = [];

  for (const name of Object.keys(interfaces)) {
    for (const iface of interfaces[name]) {
      const { address, family, internal } = iface;

      // 只处理 IPv4，且非内部地址（排除回环、VPN、虚拟网卡等）
      if (family !== 'IPv4' || internal) {
        continue;
      }

      candidates.push({
        ip: address,
        interface: name,
        matches: PRIORITY_ORDER.map(regex => regex.test(address)).indexOf(true)
      });
    }
  }

  // 按优先级排序：找到第一个匹配高优先级私有 IP 的候选
  // matches: 0 = 192.168.x.x（最高优先级），1 = 10.x.x.x，2 = 172.16.x.x ~ 172.31.x.x，-1 = 未知/低优先级
  const sorted = candidates.sort((a, b) => {
    // a.matches: 如果 regex 匹配到了，是 0, 1, 2；没匹配到是 -1
    if (a.matches === -1 && b.matches === -1) return 0;
    if (a.matches === -1) return 1;
    if (b.matches === -1) return -1;
    return a.matches - b.matches; // 数字越小优先级越高
  });

  // 返回优先级最高的那个 IP（一般就是 192.168.x.x）
  const best = sorted.find(item => item.matches !== -1);
  return best ? best.ip : null;
}

module.exports = { getLocalLANIP };
